package 常用类.String类;
/*
    String 对象用于保存字符串，也就是一组字符序列,
    String实现了Serializable,说明可以串行化，即可以在网络传输
        String实现了Comparable,说明可以比较
    字符串的字符使用的unicode字符编码，一个字符占两个字节
    String 是final 类，不能被其他类继承
    String 有属性 private final value[];存放字符串内容（即字符串使用被final修饰的字符数组存储的）
        value 是一个final类型，代表value的地址不能被修改，但是内容可以改
 */
@SuppressWarnings("all")
public class String01 {
    public static void main(String[] args) {
        //方式一：创建字符串 直接赋值先从常量池查看是否"hsp"数据空间，
        //如果有，就直接返回；如果没有就重新创建，然后指向，s最终指向的是常量池的地址
        String s = "hsp";

        //方式二：现在堆中创建空间，里面维护了value属性，指向常量池的hsp空间，
        //如果常量池没有"hsp",重新创建，如果有，直接通过value指向，最终指向的是堆中的空间地址
        String s1 = new String("hsp");

        String a = "abc";
        String b = "abc";
        //直接赋值，a先去常量池查看，没有创建"abc"，b也是去常量池查看，存在"abc"，直接将常量池的"abc"地池赋值给b
        System.out.println(a.equals(b));
        System.out.println(a == b);

        String c = "hsp"; //c指向常量池的地址
        String d = new String("hsp"); //d 指向堆中对象的地址
        System.out.println(c.equals(d)); //true
        System.out.println(c == d); //false
        //b.intern():最终返回常量池的地址(对象)-如果常量池包含了一个等于此String对象的字符串，
        // 则返回池中的字符串，否则，将此String对象添加到池中，并返回此String对象的引用

        System.out.println(c == d.intern());//true
        System.out.println(d == c.intern());//false

        String a1 = "hello";
        String b1 = "world";
        String c1 = a1 + b1;

        Test ex = new Test();
        ex.change(ex.str, ex.ch);
        System.out.print(ex.str + "end");
        System.out.println(ex.ch);
    }
}

class Test{
    String str = new String("hsp");
    final char[] ch = {'j', 'a', 'v', 'a'};

    public void change(String str, char ch[]){
        str = "java";
        ch[0] = 'h';
    }
}
